package com.learn.demo.netty.rpc.netty;

import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import lombok.extern.slf4j.Slf4j;

import java.util.concurrent.Callable;

/**
 * 客户方业务处理器
 *
 * @author banjiawei
 * @date 2022/03/11
 */
@Slf4j
public class NettyClientHandler extends ChannelInboundHandlerAdapter implements Callable<Object> {
    /**上下文*/
    private ChannelHandlerContext context;
    /**返回的结果*/
    private String result;
    /**客户端调用方法时传入的参数*/
    private String params;

    /**
     * 初始化时，第一步被调用
     * @author banjiawei
     * @date 2022/3/11
     * @param ctx
     * @return void
     */
    @Override
    public void channelActive(ChannelHandlerContext ctx) throws Exception {
        this.context = ctx;
        log.info("初始化NettyClientHandler======================================channelActive");
    }

    /**
     * 收到服务器消息后，第四步调用
     * @author banjiawei
     * @date 2022/3/11
     * @param ctx
     * @param msg
     * @return void
     */
    @Override
    public synchronized void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        log.info("收到服务器消息======================================channelRead");
        this.result = msg.toString();
        //唤醒等待的线程
        notify();
    }

    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        log.error("发生异常", cause);
        ctx.close();
    }

    /**
     * （第三步调用）被代理对象调用，发送数据给服务器，发送之后等待被唤醒
     * @author banjiawei
     * @date 2022/3/11
     * @param
     * @return java.lang.Object
     */
    @Override
    public synchronized Object call() throws Exception {
        //发送数据给服务器
        this.context.writeAndFlush(params);
        //进行wait，等待channelRead方法进行notify方法来唤醒
        wait();
        return this.result;
    }

    /**
     * 设置参数时，第二步进行调用
     * @author banjiawei
     * @date 2022/3/11
     * @param params
     * @return void
     */
    public void setParams(String params) {
        this.params = params;
    }
}
